package com.powernode.rules.service.impl;

import com.powernode.model.form.rules.RewardRuleRequest;
import com.powernode.model.form.rules.RewardRuleRequestForm;
import com.powernode.model.vo.rules.RewardRuleResponse;
import com.powernode.model.vo.rules.RewardRuleResponseVo;
import com.powernode.rules.config.DroolsHelper;
import com.powernode.rules.service.RewardRuleService;
import lombok.extern.slf4j.Slf4j;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

/**
 * 奖励规则服务实现类
 * 使用Drools规则引擎计算订单奖励费用
 */
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class RewardRuleServiceImpl implements RewardRuleService {
    /**
     * 计算订单奖励费用
     * 根据订单数量等条件，使用Drools规则引擎计算符合条件的奖励金额
     *
     * @param rewardRuleRequestForm 奖励规则请求表单，包含计算奖励所需的参数
     * @return 奖励规则响应对象，包含计算得到的奖励金额
     */
    @Override
    public RewardRuleResponseVo calculateOrderRewardFee(RewardRuleRequestForm rewardRuleRequestForm) {
        // 创建奖励规则请求对象，用于传递给Drools规则引擎
        RewardRuleRequest rewardRuleRequest = new RewardRuleRequest();
        // 设置订单数量，这是计算奖励的关键参数
        rewardRuleRequest.setOrderNum(rewardRuleRequestForm.getOrderNum());

        // 加载Drools奖励规则文件并创建KieSession会话
        // KieSession是Drools规则引擎的核心接口，用于执行规则
        KieSession kieSession = DroolsHelper.loadForRule("rules/RewardRule.drl");
        // 创建奖励规则响应对象，用于存储规则执行后的奖励结果
        RewardRuleResponse rewardRuleResponse = new RewardRuleResponse();
        // 设置全局变量，使规则可以直接操作该响应对象
        kieSession.setGlobal("rewardRuleResponse", rewardRuleResponse);
        // 将请求对象插入到工作内存中，供规则条件匹配使用
        kieSession.insert(rewardRuleRequest);
        // 触发并执行所有匹配的规则
        kieSession.fireAllRules();
        // 释放KieSession资源，避免内存泄漏
        kieSession.dispose();

        // 创建奖励规则响应视图对象，用于返回给前端或调用方
        RewardRuleResponseVo rewardRuleResponseVo = new RewardRuleResponseVo();
        // 设置奖励规则ID（固定为1L，可能需要根据实际业务调整）
        rewardRuleResponseVo.setRewardRuleId(1L);
        // 设置计算得到的奖励金额
        rewardRuleResponseVo.setRewardAmount(rewardRuleResponse.getRewardAmount());
        // 返回包含奖励信息的响应对象
        return rewardRuleResponseVo;
    }
}
